package com.mall.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.mall.context.BaseContext;
import com.mall.domain.dto.CartDTO;
import com.mall.domain.dto.ItemPageQueryDTO;
import com.mall.domain.dto.UpdateQuantityDTO;
import com.mall.domain.po.Cart;
import com.mall.domain.po.Category;
import com.mall.domain.po.Item;
import com.mall.domain.vo.CartVO;
import com.mall.mapper.CartMapper;
import com.mall.mapper.CategoryMapper;
import com.mall.mapper.ItemMapper;
import com.mall.service.CartService;
import com.mall.service.ItemService;
import lombok.Builder;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @description: 购物车服务实现类
 * @author 勾新杰
 * @version 1.0
 * @date 2024/11/24 20:36
 */
@Service
@RequiredArgsConstructor
public class CartServiceImpl implements CartService {

    private final CartMapper cartMapper;

    private final ItemMapper itemMapper;

    private final CategoryMapper categoryMapper;

    /**
     * 添加购物车
     *
     * @param cartDTO 购物车传输对象
     */
    @Override
    public void addCart(CartDTO cartDTO) {
        // 1. 构建购物车对象
        Cart cart = Cart.builder()
                .userId(BaseContext.getCurrentId())
                .createTime(LocalDateTime.now())
                .updateTime(LocalDateTime.now())
                .build();
        // 2. 复制属性
        BeanUtil.copyProperties(cartDTO, cart);
        // 3. 插入数据库
        cartMapper.insert(cart);
    }

    /**
     * 修改购物车条目商品的数量
     *
     * @param quantityDTO 修改数量传输对象
     */
    @Override
    public void updateQuantity(UpdateQuantityDTO quantityDTO) {
        // 1. 构建购物车对象
        Cart cart = Cart.builder()
                .updateTime(LocalDateTime.now())
                .build();
        // 2. 复制属性
        BeanUtil.copyProperties(quantityDTO, cart);
        // 3. 更新数据库
        cartMapper.update(cart);
    }

    /**
     * 删除购物车条目
     *
     * @param id 购物车条目id
     */
    @Override
    public void deleteCart(Long id) {
        cartMapper.deleteById(id);
    }

    /**
     * 增加购物车条目商品数量
     *
     * @param id 购物车条目id
     */
    @Override
    public void increaseQuantity(Long id) {
        cartMapper.increaseQuantity(id);
    }

    /**
     * 减少购物车条目商品数量
     *
     * @param id 购物车条目id
     */
    @Override
    public void decreaseQuantity(Long id) {
        // 1. 减少数量
        cartMapper.decreaseQuantity(id);
        // 2. 获取购物车条目
        Cart cart = cartMapper.getById(id);
        // 3. 如果数量小于等于0，删除购物车条目
        if (cart.getQuantity() <= 0){
            cartMapper.deleteById(id);
        }
    }

    /**
     * 查询购物车列表
     *
     * @return 购物车列表
     */
    @Override
    public List<CartVO> listCart() {
        // 1. 获取用户购物车列表
        List<Cart> cartList = cartMapper.getByUserId(BaseContext.getCurrentId());
        // 2. 遍历购物车列表，获取商品信息
        List<CartVO> cartVOList = BeanUtil.copyToList(cartList, CartVO.class);
        // 3. 复制商品信息
        for (CartVO cartVO : cartVOList) {
            // 3.1. 获取商品
            Item item = itemMapper.getById(cartVO.getItemId());
            // 3.2. 获取商品分类
            Category category = categoryMapper.getById(item.getCategoryId());
            // 3.3. 复制属性
            BeanUtil.copyProperties(item, cartVO);
            // 4.4. 复制分类名称
            cartVO.setCategoryName(category.getName());
        }
        // 4. 返回
        return cartVOList;
    }

    /**
     * 清空购物车
     */
    @Override
    public void clearCart() {
        cartMapper.deleteByUserId(BaseContext.getCurrentId());
    }
}
